package com.cheng.example.book.advise151.chap8.client120;

class SafeStopThread extends Thread {
    // 此变量必须加上volatile
    /*
     * volatile: 1.作为指令关键字，确保本条指令不会因编译器的优化而省略，且要求每次直接读值.
     * 2.被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile
     * ，基本上会导致这样的结果：要么无法编写多线程程序，要么编译器失去大量优化的机会。
     */
    private volatile boolean stop = false;

    @Override
    public void run() {
        // 判断线程体是否运行
        while (stop) {
            // doSomething
        }
    }

    public void terminate() {
        stop = true;
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread() {
            @Override
            public void run() {
                // 线程一直运行
                while (true&&!isInterrupted()) {
                    System.out.println("Running......");
                }
            }
        };
        // 启动线程
        thread.start();
        // 中断线程

        Thread.sleep(1000);
        //interrupt，名字看上去很像是终止一个线程的方法，但它不能终止一个正在执行着的线程，它只是修改中断标志而已

        //需要自行编码实现，如此即可保证原子逻辑不被破坏，代码逻辑不会出现异常。
        thread.interrupt();
    }


}